package cn.peng.stu4teach.util.webview;

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.databinding.library.baseAdapters.BR;
import androidx.lifecycle.ViewModelProvider;

import com.blankj.utilcode.util.LogUtils;

import cn.peng.stu4teach.R;
import cn.peng.stu4teach.databinding.ActivityWebViewBinding;
import cn.peng.stu4teach.util.base.BaseActivity;

/**
 * WebView 界面
 */
public class WebViewActivity extends BaseActivity<ActivityWebViewBinding, WebViewVm> {
    private static final String KEY_TITLE = "key_webview_title";
    private static final String KEY_URL   = "key_webview_url";

    /**
     * 要跳转的url地址
     */
    private String mUrl;
    private OnBackPressedCallback mBackPressedCallback;

    /**
     * 打开该页面
     */
    public static void start (Context pCtx, String pTitle, String pUrl) {
        Intent intent = new Intent(pCtx, WebViewActivity.class);
        intent.putExtra(KEY_TITLE, pTitle);
        intent.putExtra(KEY_URL, pUrl);
        pCtx.startActivity(intent);
    }

    @Override
    public int setLayoutId () {
        return R.layout.activity_web_view;
    }

    @Override
    public int setBrVmId () {
        return BR.vm;
    }

    @Override
    public WebViewVm setBrVm () {
        return new ViewModelProvider(this).get(WebViewVm.class);
    }

    @Override
    public void initData () {
        super.initData();

        getDataFromIntent();

        initWebView();
        // 确保清单文件中添加了 <uses-permission android:name="android.permission.INTERNET" />
        mBinding.webview.loadUrl(mUrl);

        initClickListener();
    }


    private void initWebView () {
        WebSettings webSettings = mBinding.webview.getSettings();
        // 启用js支持，虽然启用后能获取更多功能支持，但同时也会有 XSS 攻击风险
        // XSS 攻击介绍：https://cloud.tencent.com/developer/article/1612474
        webSettings.setJavaScriptEnabled(true);
        // 允许加载混合资源（混合资源：https页面内加载了http的资源）
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        // 启用Dom存储，不设置的话，加载微信公众号文章时不显示文章内容。
        webSettings.setDomStorageEnabled(true);

        // 当用户点击了网页中的子页面是，判断是否需要调用系统浏览器打开子页面
        mBinding.webview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request) {
                // 直接 return false; 表示所有页面都在当前 webview 中展示。
                return false;
                //if ("www.baidu.com".equals(request.getUrl().getHost())) {
                //    // 如果是我们自己的网站，不需要使用系统浏览器打开。
                //    return false;
                //}
                //
                //// 其他网站，使用系统浏览器打开
                //Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
                //startActivity(intent);
                //return true;
            }
        });

        mBackPressedCallback = getOnBackPressedCallback();
        // 现在使用这种方式处理 “返回” 事件。不再使用 onBackPressed() 了
        getOnBackPressedDispatcher().addCallback(mBackPressedCallback);
    }

    /**
     * 获取手机系统返回事件的回调
     */
    @NonNull
    private OnBackPressedCallback getOnBackPressedCallback () {
        return new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed () {
                if (mBinding.webview.canGoBack()) {
                    mBinding.webview.goBack();
                }else{
                    finish();
                }
            }
        };
    }

    /**
     * 初始化点击事件
     */
    private void initClickListener () {
        mBinding.ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick (View v) {
                if (mBinding.webview.canGoBack()) {
                    mBinding.webview.goBack();
                }else {
                    finish();
                }
            }
        });
    }

    /**
     * 从 intent 中读取数据
     */
    private void getDataFromIntent () {
        Intent intent = getIntent();
        if (null == intent) {
            return;
        }
        String title = intent.getStringExtra(KEY_TITLE);
        if (!TextUtils.isEmpty(title)) {
            mBinding.setTitle(title);
        }

        mUrl = intent.getStringExtra(KEY_URL);
        LogUtils.d("WebViewActivity-要加载的url=",mUrl);
    }

    @Override
    protected void onDestroy () {
        super.onDestroy();
        mBackPressedCallback.remove();
    }

    /**
     * 启用其他 WebSettings
     * <p></>
     * 如果遇见url中的内容无法加载的情况，先判断目标地址是不是 http , 如果是，先去 xml/network_security_config.xml 中添加为白名单地址。
     * 如果是 https 或 http 添加白名单后问题依旧，可以尝试启用下面的部分配置。——不建议一次全部启用，最好是挨个试一试。
     * <p></>
     * 如果还是不行，有可能就是硬件加速导致的，到 androidManifest.xml 中配置 android:hardwareAccelerated="false"
     */
    private void initOtherWebSettings(WebSettings settings){
        // 自动加载图片
        settings.setLoadsImagesAutomatically(true);
        // 启用DOM存储。启用后可解决加载微信公众号文章时不展示内容的问题。
        settings.setDomStorageEnabled(true);
        // 启用数据库存储
        settings.setDatabaseEnabled(true);
        // 允许从file URL加载的文件访问其他文件URL
        settings.setAllowFileAccess(true);
        // 解决图片不加载的问题
        settings.setBlockNetworkImage(false);
        // 允许自动播放媒体。需要在AndroidManifest.xml中申请网络访问权限,即：
        // <uses-permission android:name="android.permission.INTERNET" />
        settings.setMediaPlaybackRequiresUserGesture(false);
    }
}